package E_2024;

import java.util.Stack;

/*
报文解压缩
题目描述
    为了提升数据传输的效率，会对传输的报文进行压缩处理输入一个压缩后的报文，
    请返回它解压后的原始报文.压缩规则:n[str]，表示方括号内部的str正好重复n次。
    注意n为正整数(0<n<=100)，str只包含小写英文字母，不考虑异常情况
输入描述
    输入压缩后的报文
    1)不考虑无效的输入，报文没有额外的空格，方括号总是符合格式要求的;
    2)原始报文不包含数字，所有的数字只表示重复的次数n，例如不会出现像5或3[8]的输入
输出描述
    解压后的原始报文
    注:原始报文长度不会超过1000，不考虑异常的情况
    https://pica.zhimg.com/v2-65f1f9d0b74ad33c3096e9770c0d0300_1440w.jpg
 */
public class E_200_22 {
    public static void main(String[] args) {
        ans("3[m2[c]]");
        ans("3[k]2[mn]");
    }
    public static void ans(String str){
        Stack<Character> stack = new Stack<>();
        for (int i = 0; i < str.length(); i++) {
            char ch = str.charAt(i);
            if (ch == ']'){
                StringBuilder sb = new StringBuilder();
                while((ch = stack.pop()) != '['){
                    sb.append(ch);
                }
                StringBuilder num = new StringBuilder();
                while(!stack.isEmpty() && stack.peek() <= '9'){
                    num.append(stack.pop());
                }
                String s = sb.reverse().toString();
                for (int k = 0; k < Integer.parseInt(num.toString()); k++) {
                    for (char c : s.toCharArray()) {
                        stack.push(c);
                    }
                }
            }else
                stack.push(ch);
        }
        System.out.println(stack);
    }
    public static int tm(String str, int index, Stack<String> temp){
        int num = 0;
        int right = index;
        while (right < str.length()){
            char ch = str.charAt(right);
            if (ch >= '0' && ch <= '9'){
                num++;
                if (right > index){
                    temp.add(str.substring(index,right));
                }
            } else if (ch == '[') {
                temp.add(str.substring(right-num,right));
                right = tm(str,right +1, temp);
            } else if (ch == ']'){
                return right;
            }
            right++;
        }
        return right;
    }
}
